home *** CD-ROM | disk | FTP | other *** search
/ PD ROM 1 / PD ROM Volume I - Macintosh Software from BMUG (1988).iso / Graphics / Graphic Demos / Super MandelZoom / Fractals / Super MZ doc part 2 < prev   
Encoding:
Text File  |  1986-12-31  |  25.5 KB  |  608 lines  |  [TEXT/ttxt]

  1. Program Structure
  2. ------- ---------
  3.  
  4.    As mentioned above, whenever you wait and do nothing the program will finish executing all commands and then
  5.  
  6. automatically draw the image at progressively higher degrees of resolution until it has drawn the whole image at
  7.  
  8. 256x256 resolution.  This is accomplished through a complex "multiprocessing" technique which allows commands to
  9.  
  10. be executed in order of importance rather than in the order that they were received.  A more detailed explanation
  11.  
  12. of what is going on is given here (also, those trying to understand the source code should find this section
  13.  
  14. particularly useful.)
  15.  
  16.  
  17.    The main control process of Super MANDELZOOM (which is called _EXEC) simulates a batch multitasking system
  18.  
  19. with a pre-emptive "fastest first" priority scheme (with a few exceptions as explained below)  At any given time,
  20.  
  21. there may be many activities pending.  These activities include evaluating the image, evaluating part of the
  22.  
  23. image selected by the Detail command, redrawing the picture with a new shading table, plotting a Julia curve,
  24.  
  25. running the Query command on a point, etc.  Except in two special cases, there is only one process running at a
  26.  
  27. given time.  Whenever a command is received or the currently running process finishes normally, control is
  28.  
  29. transfered to _EXEC.  _EXEC keeps track of which processes are waiting to start, which ones have been pre-empted
  30.                                            ~~~~~~~~~~~~~~~~                       ~~~~~~~~~~
  31. (interrupted,) which ones have been aborted (terminated before they finished their job,) and which ones have
  32.                     ~~~~~~~
  33. finished.  It then runs that process which is still not finished and which has highest priority.  The priority
  34. ~~~~~~~~
  35. assignment, from highest to lowest, is as follows ("current selection" is the rectangle most recently selected
  36.  
  37. with the Detail command):
  38.  
  39.  
  40.          Prio #  Process Name                         Activity
  41.          ------  ------------   -------------------------------------------------------
  42.            0.    _EXEC          Receiving and interpreting commands
  43.            1.    _DRAW_PIC      Evaluating and/or redrawing the Mandelbrot Set image at
  44.                     8x8 resolution
  45.            2.    _JULIA         Drawing a picture of a Julia curve
  46.            3.    _QUERY         Determining n_max and attractor period for a point
  47.            *     _D_TRACK       Selecting a rectangular section of the image with the
  48.                     mouse
  49.            *     _MOUSE_PT      Continuously displaying the coordinates of the point
  50.                        under the cursor
  51.            4.    _REFILL     a. Redrawing the entire image at 1x1 resolution
  52.                      b. Redrawing the entire image at 2x2 resolution
  53.                      c. (etc...)
  54.                      i. Redrawing the entire image at 256x256 resolution
  55.            5.    _DETAIL        Evaluating points in the current selection
  56.            6.    _IDLE_MODE  a. Evaluating points outside the current selection at
  57.                     16x16 resolution
  58.                      b. Evaluating points outside the current selection at
  59.                     32x32 resolution
  60.                      c. (etc...)
  61.                      e. Evaluating points outside the current selection at
  62.                     256x256 resolution
  63.            7.    _Q_SEARCH      Breadth-first search for all points which are adjacent
  64.                        to points of a different count value, at 256x256
  65.                     resolution
  66.  
  67.  
  68. _D_TRACK and _MOUSE_PT are special cases - they are run concurrently with _REFILL, _DETAIL, _IDLE_MODE, and/or
  69.  
  70. _Q_SEARCH.  See the descriptions of _D_TRACK and _MOUSE_PT below.
  71.  
  72.    The following table shows the relationship between commands and processes:
  73.  
  74.  
  75.  __      Process |
  76.    ~~---__  Name | _EXEC  _JULIA  _DRAW_PIC  _QUERY  _D_TRACK  _MOUSE_PT  _REFILL  _DETAIL  _IDLE_MODE _Q_SEARCH
  77.  Command  ~~--__ |
  78.  ----------------+----------------------------------------------------------------------------------------------
  79.  (Program Start) |   *                *                                                         *          *
  80.  ----------------+----------------------------------------------------------------------------------------------
  81.  Palette         |   *                                                                       
  82.  Julia           |   *       *                                              * •                     
  83.  Query           |   *                          *                                          
  84.  Edit Table      |   *                                                      * •                     
  85.  Detail          |   *                                   *                           * •                  * •
  86.  MousePt         |   *                                            */•
  87.  Scroll          |   *                *                                      •        •        * •        * •
  88.  Zoom            |   *                *                                      •        •        * •        * •
  89.  Set N_max       |   *                *                                      •        •        * •        * •
  90.  Set # of Bits   |   *                *                                      •        •        * •        * •
  91.  
  92.  
  93. In this table, an asterisk indicates that the command on the left causes the process to become initiated.  A
  94.  
  95. bullet (•) indicates that the command on the left causes the process to be aborted.  All processes except _JULIA
  96.  
  97. finish by themselves if they are given enough time.
  98.  
  99.  
  100.  
  101. _JULIA
  102.  
  103.    The Julia curve program plots the iterates of Z  under the inverse of the self-squared function described in
  104.                           n
  105.  
  106. the Mathematical Background section.  This function has two possible values, and contains a square root.  The
  107.  
  108. choice is made pseudo-randomly, and computations are made using 16-bit accuracy.  _JULIA aborts when you press
  109.  
  110. the mouse button -- the next time it runs it does not continue where it left off but starts over from scratch.
  111.  
  112.  
  113.  
  114. _DRAW_PIC
  115.  
  116.    _DRAW_PIC evaluates and draws the picture at 8x8 resolution.  It must be run at least once on an image
  117.  
  118. before _REFILL, _DETAIL, _IDLE_MODE, and _Q_SEARCH can be run because it initializes the array with the correct
  119.  
  120. structure so that those routines can tell what size each of the pixels are.  Therefore, it is never pre-empted
  121.  
  122. but runs until it is finished.  Because it is sometimes noticably slow, it changes the cursor to a wristwatch
  123.  
  124. while it is running.
  125.  
  126.  
  127.  
  128. _QUERY
  129.  
  130.    _QUERY runs the iterated function (1b.) above on just one point, using 32-bit math.  If condition (4) above is
  131.  
  132. still satisfied after 1000 iterations, _QUERY runs for another 1000 iterations looking for an attractor.  It
  133.  
  134. finds an attractor if during these 1000 iterations it finds a value Z  which is no more than 5 units away from
  135.                                      n
  136.  
  137. Z     in either the real or imaginary directions.  In this case, the period of the attractor is n - 1000.  If it
  138.  1000
  139.  
  140. finds a value Z  which does not meet condition (4), then a non-member point has been found and count equals n.
  141.                n
  142.  
  143. If Z     meets condition (4) and no attractor was found the point is reported as having count>2000 and cycle
  144.     2000
  145.  
  146. unknown.
  147.  
  148.    _QUERY never takes more than a second or so to run, so it is not pre-empted or aborted by anything.
  149.  
  150.  
  151.  
  152. _REFILL
  153.  
  154.    _REFILL runs in nine passes.  (In this table, the times are based on the benchmark test described above.)
  155.  
  156.  
  157.                       Pass   Resolution   Time (Sec.)
  158.                       ----   ----------   -----------
  159.                         1     1x1             0.0 
  160.                         2     2x2             0.0
  161.                         3     4x4             0.1
  162.                         4     8x8             0.1 
  163.                         5     16x16           0.3
  164.                         6     32x32           0.7
  165.                         7     64x64           2.2
  166.                         8     128x128         5.8
  167.                         9     256x256      + 18.3
  168.                                    ------
  169.                               Total  27.5
  170.  
  171.  
  172. In each pass, _REFILL scans the array and draws all areas which have been evaluated at the indicated resolution
  173.  
  174. or more.  There are two reasons why pass number 8 (for example) doesn't take 4 times as long as pass number 7.
  175.  
  176. First, although pass number 8 makes more QuickDraw calls, the individual pixels involved are smaller and don't
  177.  
  178. take as long as those in pass 7.  Second, in each pass _REFILL skips a point if its area of the screen has
  179.  
  180. already been filled in with the proper shade of gray by one of the previous passes.
  181.  
  182.    The 256x256 array used to store the "count" values for the points in the image has 65,536 entries.  Each of
  183.  
  184. these is one byte long.  The high bit is a flag used by the _DETAIL routine (see below) and the other seven bits
  185.  
  186. store a value from 0 to 127.  If this value is zero, the point hasn't been evaluated yet.  If the value is 127,
  187.  
  188. the point is in the Mandelbrot Set.  All other values indicate what the count for that point is.  Since the
  189.  
  190. "count" value can actually be as high as 1000, the "count" must be translated to a "modified count" which falls
  191.  
  192. somewhere in the range 1 to 126.  The modified count is used as an index into the shading table, which has 128
  193.  
  194. entries (and the structure of which is described under the "Edit Shading Table" section under Using the Program
  195.                                                   ~~~~~ ~~~ ~~~~~~~
  196. above.)
  197.  
  198.    _REFILL is pre-empted by _JULIA.  All other commands cause it to abort except _DETAIL, which waits until
  199.  
  200. _REFILL is done running.
  201.  
  202.  
  203.  
  204. _DETAIL
  205.  
  206.    _DETAIL scans through each of the points in the selected rectangle, and determines what resolution it has been
  207.  
  208. computed at.  If the point has not yet been computed at 256x256 resolution, _DETAIL splits the point into four
  209.  
  210. points of the next-higher level of resolution, and evaluates and plots each of the smaller points.  _DETAIL does
  211.  
  212. not use an adjacency algorithm (described below under _IDLE_MODE) because oftentimes not all of the neighbors of
  213.  
  214. a point being evaluated by _DETAIL have been evaluated to the same leval of resolution.
  215.  
  216.    _DETAIL is pre-empted by all processes except _IDLE_MODE and _Q_SEARCH.  It is aborted by scrolling, zooming,
  217.  
  218. changing n_max or the number of bits, and by sending another Detail command.  On a 512K Mac it does not run at
  219.  
  220. all after _Q_SEARCH has started, because _Q_SEARCH does not "split" pixels in a way which is compatible with the
  221.  
  222. algorithm used in _DETAIL.
  223.  
  224.  
  225.  
  226. _IDLE_MODE
  227.  
  228.    _IDLE_MODE runs in five passes.  (The times are based on the benchmark test described above.)
  229.  
  230.  
  231.                 Pass   From     To       Adjacency Alg.  Time (Sec.)
  232.                 ----   -------  -------  --------------  -----------
  233.                   1    8x8      16x16         no               2.6
  234.                   2    16x16    32x32         no               5.9
  235.                   3    32x32    64x64         no              20.9
  236.                   4    64x64    128x128      yes              49.9
  237.                   5    128x128  256x256      yes             160.6
  238.                                           ----------
  239.                                     Total    239.9
  240.  
  241.  
  242.    In each pass, the program scans the entire image looking for pixels which are drawn in the level of resolution
  243.  
  244. listed in the "From" column.  When it finds one, it breaks the pixel up into four smaller pixels.  When it has
  245.  
  246. done this for the entire image, the picture has the resolution shown in the "To" column.
  247.  
  248.    When the adjacency algorithm is enabled (passes 4 and 5) _IDLE_MODE skips a pixel if it has no neighbors with
  249.  
  250. a different value of "count".  This means that if there is a large area on the screen which is all the same value
  251.  
  252. of "count", _IDLE_MODE will skip all the pixels in the middle and break up only the ones around the edges.
  253.  
  254.    This is a fairly good algorithm, and normally it will perform quite well, giving 10% to 40% speed increases
  255.  
  256. (or sometimes more.)  However, it does not always work, because sometimes a region which appears to be solid at
  257.  
  258. low resolution turns out to contain some pixels of a different shade when drawn at high resolution.  To see one
  259.  
  260. of these regions, run Super MANDELZOOM and set it to Center=0.00+0.75i, Size=0.25.  You can do this by zooming in
  261.  
  262. once, hitting the up arrow three times and then zooming in three times.  In the very lower-left of the picture
  263.  
  264. you will see a "cusp" of the gray region.  This cusp is an example of a region which looks solid black at low
  265.  
  266. resolution but which actually has some non-black points at high resolution.  Now wait until it finishes plotting
  267.  
  268. the "cusp" at 256x256 resolution (but before it starts running _Q_SEARCH, see below.)  Then, with the Detail
  269.  
  270. command select the area at the very tip of the cusp, and select a good-sized part of the black space around it,
  271.  
  272. too.  You will see the point get a little bit longer: the area at the very end of the cusp was missed by
  273.  
  274. _IDLE_MODE.
  275.  
  276.    To avoid this problem, two solutions are used in combination.  First, the adjacency algorithm is not used in
  277.  
  278. the first three passes; therefore it never misses any features which are more than 3 pixels across.  Second,
  279.  
  280. the process _Q_SEARCH, which runs after _IDLE_MODE is finished, finds and draws any points which were missed by
  281.  
  282. _IDLE_MODE.
  283.  
  284.    _IDLE_MODE is pre-empted by all other processes except _Q_SEARCH and the two time-sharing processes.  It is
  285.  
  286. aborted by scrolling, zooming, changing n_max and changing the number of bits.
  287.  
  288.  
  289.  
  290. _Q_SEARCH
  291.  
  292.    _Q_SEARCH is a breadth-first search for all points in the image which are adjacent to a point with a different
  293.  
  294. value of "count".  The breadth-first search finds all member points which lie on the border between one solid
  295.  
  296. region and another.  The search is possible because all boundary points are connected to each other - that is,
  297.  
  298. there are no "island regions" anywhere (except certain features which are narrower than the resolution used to
  299.  
  300. draw the image.)  _Q_SEARCH simply starts in the upper-left corner and "walks" along the edges of the image and
  301.  
  302. along all of the "contours" in the image itself, tracing along each contour from both ends until it meets itself
  303.  
  304. in the middle.
  305.  
  306.    _Q_SEARCH is an improvement of the algorithm used in the browser program written in C by John White
  307.  
  308. (jnw@mcnc.UUCP) at the Microelectronics Center of NC; RTP, NC, and posted to the USENET computer network.  It was
  309.  
  310. once used as the primary evaluation algorithm of the whole program, because it offers speed savings comparable to
  311.  
  312. those of _IDLE_MODE's adjacency algorithm.  It was fun to watch _Q_SEARCH "trace out" the picture, but in the
  313.  
  314. end, _IDLE_MODE proved to be faster.  (_Q_SEARCH has a lot more overhead)
  315.  
  316.    _Q_SEARCH is pre-empted by every other process.  _DETAIL will make _Q_SEARCH start over again if it isn't
  317.  
  318. finished.
  319.  
  320.  
  321.  
  322. Low-Level Math Routines
  323.  
  324.    For each of the three higher precisions there are optimized LongMult (compute X times Y) and LongSquare
  325.  
  326. (compute X squared) routines.  Programmers wishing to speed up their own programs can use these LongMult and
  327.  
  328. LongSquare routines; they serve quite well as "generic" integer multiply routines.  (If you don't have the source
  329.  
  330. code, the "About..." menu command in the program tells you how to get it.)
  331.  
  332.    For 16-bit math, I have one sign bit, one integer bit and 14 bits for the fraction, and I just use the MULS
  333.  
  334. instruction to get a product with 28 bits to the right of the "binary point", and I shift it into position to get
  335.  
  336. the answer.
  337.  
  338.    My 32-bit numbers have one sign bit, one bit to the left of the point and 30 bits to the right of the point.
  339.  
  340. I use a "standard" 32x32 -> 64 integer multiply algorithm, and this gives me a product with one sign bit, 3
  341.  
  342. bits to the left of the binary point, and 60 bits to the right.  I then shift it left 2 bits and the high 32 bits
  343.  
  344. is my answer.
  345.  
  346.    For the 30-bit math, my numbers are in the same format as the 32-bit numbers, but I ignore one of the four
  347.  
  348. partial products.  In the following diagram, a, b, c, and d are 16-bit pieces of the two factors, and p through w
  349.  
  350. are 16-bit pieces of the partial-products.  In my 30-bit math algorithm, I don't compute the partial product
  351.  
  352. b * d.  That means that my answer is only correct in the highest 32 bits, so when I shift it to the left I get two
  353.  
  354. zeros in the bottom two bits - thus, I get 30-bit precision out of it (but I save 25% of my time, or 33% for the
  355.  
  356. LongSquare routine.)
  357.                         factor 1                    a     b
  358.                         times factor 2           x  c     d
  359.                                     ------------
  360.                         b * d                       p     q
  361.                         a * d                 r     s
  362.                         b * c                 t     u
  363.                         a * c        +  v     w
  364.                             ------------------------
  365.                         product         v   r+t+w p+s+u   q
  366.  
  367.  
  368.    For 18-bit math, I have one sign bit, 15 bits to the left of the point and 16 to the right.  (This is Apple's
  369.  
  370. 32-bit fixed-point format.)  As with the 30 and 32-bit routines, both factors are made positive before I multiply
  371.  
  372. them, so that means that a and c are both either 0 or 1.  Therefore, a*c equals a AND c, and a*d and b*c are both
  373.  
  374. done by testing a (or c) and adding d (or b) if it's non-zero.  That means that I only need one MULU, for b*d.
  375.  
  376. The answer has one sign bit, 31 bits to the left and 32 bits to the right of the binary point, and I just take
  377.  
  378. the two middle words for my answer, no shifting required.
  379.  
  380.  
  381.  
  382. Future Considerations
  383.  
  384.    The modified-count value 126 is unused because it is reserved for future optimization of the "change n_max"
  385.  
  386. command.  Increasing the value of n_max can be made faster if the program re-evaluates only those points which
  387.  
  388. were previously regarded as member points.  Decreasing the value of n_max can be made much faster -- here, the
  389.  
  390. program doesn't have to re-evaluate any points, instead it can just draw points as member points if they are
  391.  
  392. greater than the user's specified value of n_max.  The complications in implementing these changes result from
  393.  
  394. the user possibly changing n_max several times and scrolling the picture, fast enough so the computer cannot
  395.  
  396. finish the whole image at any value of n_max.  In this case, the picture might become permanently inconsistent,
  397.  
  398. containing some areas which have been evaluated to a greater n_max than others.
  399.  
  400.    _QUERY can be improved by making its search technique more elaborate.  When the iterates of a point with
  401.  
  402. period k converge on the point's attractor, successive values Z ,  Z   ,  Z    , etc. converge on the attractor
  403.                                    n    n+k    n+2k
  404.  
  405. point Z     by means of a sort of spiral-shaped pattern.  Because of this spiral-shaped pattern, points Z  and
  406.        n+∞k                                                 n
  407.  
  408. Z     end up being much closer to each other than either is to the attractor point.  Here, j is an integer and jk
  409.  n+jk
  410.  
  411. is the period of the attractor for the points in the daughter µ-atom that the queryed point is close to.  Because
  412.  
  413. Z  and Z     are close to each other, _QUERY thinks that they are Z  and Z    and that the attractor point has
  414.  n      n+jk                                                       n      n+k
  415.  
  416. been found.  _QUERY can be made "smarter" by using the RHOP algorithm described in Dewdney's article.  This would
  417.  
  418. make it quite a bit slower but less likely to be "fooled" the way it is now.
  419.  
  420.    _JULIA can also be improved, most effectively by increasing the precision of math used.  It would also be nice
  421.  
  422. to distinguish dusts from connected curves and fill in the latter (somehow) with black.  _JULIA could be taken to
  423.  
  424. the ultimate extreme by plotting Julia curves the same way the Mandelbrot Set is plotted.  This would make it
  425.  
  426. much slower, but would produce prettier and entirely accurate pictures.  (In Mandelbrot's book Julia curves are
  427.  
  428. shown this way.)
  429.  
  430.    The low-level math routines can probably be optimized just a little bit more (particularly the 18-bit
  431.  
  432. routines.)  Perhaps another intermediate resolution (such as 20 bits) can be found which is faster than the
  433.  
  434. current 18-bit algorithm; then it could replace the 18-bit routines.
  435.  
  436.  
  437.  
  438. Resource File
  439.  
  440.    Users of ResEdit and other resource utility programs will find the following resources in Super MANDELZOOM 1.0:
  441.  
  442. BNDL 128, FREF 128, ICN# 128, rpmµ 128 -- These resources tell the Finder that the file is an application and
  443.  
  444.     show it what icon to put up on the screen.
  445.  
  446. CODE 0 & 1 -- The program itself, assembled and linked in one segment with the MDS assembler from Apple.
  447.  
  448. CURS 2 & 4 -- These cursors override the System file's standard "wristwatch" and "plus" cursors when the program
  449.  
  450.     is running.  I made the wristwatch look like an hourglass just for fun.  The "plus" cursor had to be
  451.  
  452.     changed because the one in Apple's System file is not totally symmetrical.
  453.  
  454. CURS 1005 -- The "Select and Zoom" cursor.
  455.  
  456. CURS 1000, 1001, 1002, 1003, 1004, 1006 -- These are all cursors I thought of using at various times while I was
  457.  
  458.     developing the program.  I left them in the resource file in case I ever decided to use them again.
  459.  
  460. FKEY 9 -- The SHIFT-CMD-9 function key, described under "Function Keys" above.  Put this in your System file if
  461.  
  462.     you want to have use of it all the time.
  463.  
  464. FOND 4 & 20 -- These are the font-family tables which the Mac Plus uses to find the Narrow Monaco and Times fonts.
  465.  
  466. FONT 512, 521, 522, & 530 -- The Narrow Monaco font overrides the standard Monaco font while Super MANDELZOOM is
  467.  
  468.     running.  If you use the Font/DA mover to move this font into a System file, it will renumber the font so
  469.  
  470.     that it no longer overrides Monaco.
  471.  
  472. FONT 2560, 2570, & 2578 -- The Times font.  The 20-point version has been modified; it contains lots of special
  473.  
  474.     characters used for the program's display.
  475.  
  476. ICON 1000, 1001, 1002, 1003, 1004, 1005, 1007, 1008 -- All of these icons are used by the program.
  477.  
  478. ICON 1006 -- This was an alternative "Select and Zoom" icon that I thought of using for a while.
  479.  
  480. MENU 128, 129, & 130 -- The program's three menus.
  481.  
  482. STR  1000, 1001, & 1002 -- Three pieces of text used in the display.  I haven't bothered to put the rest of the
  483.  
  484.     program's text in resource format yet.
  485.  
  486.  
  487.  
  488. Pleasing Areas of the Mandelbrot Set that I Have Found
  489.  
  490.    The Mandelbrot Set is full of variety, unlike most fractals.  Almost any region of the Mandelbrot Set will
  491.  
  492. provide beautiful pictures.  To give you an idea of the kinds of things you can find, here are a few of my
  493.  
  494. favorite regions:
  495.  
  496.  
  497.     Center:  -.917 +.265 i
  498.     Size:    .062
  499.     Options: Shading table # 4, 16-bit math, MaxCount = 500
  500.     Time:    About 4 minutes (256x256 resolution) 
  501.  
  502. 1. This is the one which appeared on the cover of the August 1985 Scientific American.  Shading table # 4 in my
  503.  
  504. program was designed specifically to match that picture - I used a photocopy machine to produce a black-and-white
  505.  
  506. version of it and fiddled with the shading table until I got it just right.
  507.  
  508.  
  509.     Center:  -.7455 +.1104 i
  510.     Size:    .0078
  511.     Options: Shading table # 5, 16-bit math, MaxCount = 500
  512.     Time:    About 8 minutes (256x256 resolution)
  513.  
  514. 2. This is most of the picture in figure (a) on page 18 of Dewdney's article.  The spiral shaped curlicue near
  515.  
  516. the top of the image will show many interesting features when enlarged (as the other figures in that article
  517.  
  518. show.)
  519.  
  520.  
  521.     Center:  -.050 +.670 i
  522.     Size:    .016
  523.     Options: Shading table # 4, 16-bit math, MaxCount = 1000
  524.     Time:    About 6 minutes (256x256 resolution)
  525.  
  526. 3. This area is similar to number 2 above, but here the spirals have three arms each and look quite a bit like
  527.  
  528. "galaxies."
  529.  
  530.  
  531.     Center:  +.26574 -.00320 i
  532.     Size:    .00012
  533.     Options: Shading table # 4, 30-bit math, MaxCount = 1000
  534.     Time:    About 6 minutes (128x128 resolution)
  535.  
  536. 4. This is a "miniature Mandelbrot Set", a tiny replica of the main Mandelbrot Set, and as you can see it is
  537.  
  538. quite "lopsided" or distorted.  By searching more closely to the cusp at 0.25 + 0.00 i, smaller and even more
  539.  
  540. distorted miniature Mandelbrot Sets like this one can be found.
  541.  
  542.  
  543.     Center:  -.579 +.487 i
  544.     Size:    .031
  545.     Options: Shading table # 4, 16-bit math, n_max = 500
  546.     Time:    About 5 minutes (256x256 resolution)
  547.  
  548. 5. This is a 12-pointed "star" (filament structure) with "arms" that vary in length in an irregular pattern.  At
  549.  
  550. the end of each arm is a smaller star with the same irregular pattern.
  551.  
  552.  
  553.     Center:  -.02641 +.74842 i
  554.     Size:    .00098
  555.     Options: Shading table # 3. 30-bit math, n_max = 500
  556.     Time:    About 4 1/2 minutes (128x128 resolution)
  557.  
  558. 6. This is one of my favorite images (along with many others I have found which are like it) because it shows
  559.  
  560. three-armed spirals, four-armed spirals, and five-armed "stars" in the same picture.  (The five-armed stars are a
  561.  
  562. bit hard to see; the largest is at the bottom of the picture, centered at -.02619 +.74800 i.)  This image is part
  563.  
  564. of the filament structure of the µ-atom which I call "M.3.4.2-5".  That µ-atom has a period of 60; the larger
  565.  
  566. µ-atom to which it is attached has a period of twelve, and the µ-atom to which that µ-atom is attached has a
  567.  
  568. period of three.  The reason the features in this picture have three, four, and five sides is because of these
  569.  
  570. numbers (3, 12, and 60.) This type of relationship is universal.  For example, if you check example # 1, you will
  571.  
  572. notice that its filament structure has five-pointed stars and two-armed spirals; these numbers five and two are
  573.  
  574. directly related to the µ-atom's period (10) and its parent's period (2).  With sufficient patience you will be
  575.  
  576. able to find filament structures with any desired combination of features.  Note that miniature Mandelbrot Sets
  577.  
  578. (such as the one at -.02600 +.74805 i  in this image) appear to be at the center of a four-armed star -- but this
  579.  
  580. four-armed "star" is a different kind of star from the "stars" associated with the parent µ-atom's period.
  581.  
  582.    This image is a good example of one for which the adjacency algorithm does no good -- it takes almost exactly
  583.  
  584. four times as long to finish in 256x256 resolution as it does in 128x128 resolution.
  585.  
  586.  
  587.  
  588. User Feedback
  589.  
  590.    I would enjoy hearing from you if you find other parts of the Mandelbrot Set which you consider interesting or
  591.  
  592. unique.  I would also like to hear from you if you have suggestions for improvements in the program, if you find
  593.  
  594. bugs, and/or figure out a way to fix them.  I would particularly enjoy hearing about any desk accessories which
  595.  
  596. are useful with the program, such as a screen-saver which allows Super MANDELZOOM to continue running, or a D.A.
  597.  
  598. that lets you paste from the clipboard directly into a MacPaint document (so I don't have to use the Scrapbook
  599.  
  600. all the time.)
  601.  
  602.  
  603.                                     Robert P. Munafo
  604.  
  605.                                     Barrington, Rhode Island
  606.  
  607.                                     October 26, 1986
  608.